# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1DocumentQuery do
  @moduledoc """


  ## Attributes

  *   `customPropertyFilter` (*type:* `String.t`, *default:* `nil`) - This filter specifies a structured syntax to match against the [PropertyDefinition].is_filterable marked as `true`. The syntax for this expression is a subset of SQL syntax. Supported operators are: `=`, `!=`, `<`, `<=`, `>`, and `>=` where the left of the operator is a property name and the right of the operator is a number or a quoted string. You must escape backslash (\\\\) and quote (\\") characters. Supported functions are `LOWER([property_name])` to perform a case insensitive match and `EMPTY([property_name])` to filter on the existence of a key. Boolean expressions (AND/OR/NOT) are supported up to 3 levels of nesting (for example, "((A AND B AND C) OR NOT D) AND E"), a maximum of 100 comparisons or functions are allowed in the expression. The expression must be < 6000 bytes in length. Sample Query: `(LOWER(driving_license)="class \\"a\\"" OR EMPTY(driving_license)) AND driving_years > 10`
  *   `customWeightsMetadata` (*type:* `GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1CustomWeightsMetadata.t`, *default:* `nil`) - To support the custom weighting across document schemas, customers need to provide the properties to be used to boost the ranking in the search request. For a search query with CustomWeightsMetadata specified, only the RetrievalImportance for the properties in the CustomWeightsMetadata will be honored.
  *   `documentCreatorFilter` (*type:* `list(String.t)`, *default:* `nil`) - The exact creator(s) of the documents to search against. If a value isn't specified, documents within the search results are associated with any creator. If multiple values are specified, documents within the search results may be associated with any of the specified creators.
  *   `documentNameFilter` (*type:* `list(String.t)`, *default:* `nil`) - Search the documents in the list. Format: projects/{project_number}/locations/{location}/documents/{document_id}.
  *   `documentSchemaNames` (*type:* `list(String.t)`, *default:* `nil`) - This filter specifies the exact document schema Document.document_schema_name of the documents to search against. If a value isn't specified, documents within the search results are associated with any schema. If multiple values are specified, documents within the search results may be associated with any of the specified schemas. At most 20 document schema names are allowed.
  *   `fileTypeFilter` (*type:* `GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1FileTypeFilter.t`, *default:* `nil`) - This filter specifies the types of files to return: ALL, FOLDER, or FILE. If FOLDER or FILE is specified, then only either folders or files will be returned, respectively. If ALL is specified, both folders and files will be returned. If no value is specified, ALL files will be returned.
  *   `folderNameFilter` (*type:* `String.t`, *default:* `nil`) - Search all the documents under this specified folder. Format: projects/{project_number}/locations/{location}/documents/{document_id}.
  *   `isNlQuery` (*type:* `boolean()`, *default:* `nil`) - Experimental, do not use. If the query is a natural language question. False by default. If true, then the question-answering feature will be used instead of search, and `result_count` in SearchDocumentsRequest must be set. In addition, all other input fields related to search (pagination, histograms, etc.) will be ignored.
  *   `propertyFilter` (*type:* `list(GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1PropertyFilter.t)`, *default:* `nil`) - This filter specifies a structured syntax to match against the PropertyDefinition.is_filterable marked as `true`. The relationship between the PropertyFilters is OR.
  *   `query` (*type:* `String.t`, *default:* `nil`) - The query string that matches against the full text of the document and the searchable properties. The query partially supports [Google AIP style syntax](https://google.aip.dev/160). Specifically, the query supports literals, logical operators, negation operators, comparison operators, and functions. Literals: A bare literal value (examples: "42", "Hugo") is a value to be matched against. It searches over the full text of the document and the searchable properties. Logical operators: "AND", "and", "OR", and "or" are binary logical operators (example: "engineer OR developer"). Negation operators: "NOT" and "!" are negation operators (example: "NOT software"). Comparison operators: support the binary comparison operators =, !=, <, >, <= and >= for string, numeric, enum, boolean. Also support like operator `~~` for string. It provides semantic search functionality by parsing, stemming and doing synonyms expansion against the input query. To specify a property in the query, the left hand side expression in the comparison must be the property ID including the parent. The right hand side must be literals. For example: "\\"projects/123/locations/us\\".property_a < 1" matches results whose "property_a" is less than 1 in project 123 and us location. The literals and comparison expression can be connected in a single query (example: "software engineer \\"projects/123/locations/us\\".salary > 100"). Functions: supported functions are `LOWER([property_name])` to perform a case insensitive match and `EMPTY([property_name])` to filter on the existence of a key. Support nested expressions connected using parenthesis and logical operators. The default logical operators is `AND` if there is no operators between expressions. The query can be used with other filters e.g. `time_filters` and `folder_name_filter`. They are connected with `AND` operator under the hood. The maximum number of allowed characters is 255.
  *   `queryContext` (*type:* `list(String.t)`, *default:* `nil`) - For custom synonyms. Customers provide the synonyms based on context. One customer can provide multiple set of synonyms based on different context. The search query will be expanded based on the custom synonyms of the query context set. By default, no custom synonyms wll be applied if no query context is provided. It is not supported for CMEK compliant deployment.
  *   `timeFilters` (*type:* `list(GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1TimeFilter.t)`, *default:* `nil`) - Documents created/updated within a range specified by this filter are searched against.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :customPropertyFilter => String.t() | nil,
          :customWeightsMetadata =>
            GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1CustomWeightsMetadata.t()
            | nil,
          :documentCreatorFilter => list(String.t()) | nil,
          :documentNameFilter => list(String.t()) | nil,
          :documentSchemaNames => list(String.t()) | nil,
          :fileTypeFilter =>
            GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1FileTypeFilter.t()
            | nil,
          :folderNameFilter => String.t() | nil,
          :isNlQuery => boolean() | nil,
          :propertyFilter =>
            list(
              GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1PropertyFilter.t()
            )
            | nil,
          :query => String.t() | nil,
          :queryContext => list(String.t()) | nil,
          :timeFilters =>
            list(GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1TimeFilter.t())
            | nil
        }

  field(:customPropertyFilter)

  field(:customWeightsMetadata,
    as: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1CustomWeightsMetadata
  )

  field(:documentCreatorFilter, type: :list)
  field(:documentNameFilter, type: :list)
  field(:documentSchemaNames, type: :list)

  field(:fileTypeFilter,
    as: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1FileTypeFilter
  )

  field(:folderNameFilter)
  field(:isNlQuery)

  field(:propertyFilter,
    as: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1PropertyFilter,
    type: :list
  )

  field(:query)
  field(:queryContext, type: :list)

  field(:timeFilters,
    as: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1TimeFilter,
    type: :list
  )
end

defimpl Poison.Decoder,
  for: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1DocumentQuery do
  def decode(value, options) do
    GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1DocumentQuery.decode(
      value,
      options
    )
  end
end

defimpl Poison.Encoder,
  for: GoogleApi.ContentWarehouse.V1.Model.GoogleCloudContentwarehouseV1DocumentQuery do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
